package com.hliushi.learn.bean;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * 构造方法, 注解@PostConstruct, 实现InitializingBean方法afterPropertiesSet, bean初始化init方法执行顺序
 *
 * @author llhuang10
 * @date 2021/8/19 21:55
 */
@Slf4j
@Component
public class MyInitializingBean implements InitializingBean {

    // ----------我是依赖注入方法------------------
    // ----------我是MyInitializingBean构造方法执行----------
    // ----------我是postConstruct方法执行----------
    // ----------我是afterPropertiesSet方法执行----------
    // ----------我是init方法执行----------

    public MyInitializingBean() {
        System.out.println("----------我是MyInitializingBean构造方法执行----------");
    }

    /**
     *
     */
    @Autowired
    public void autowired(@Value("${java_home}") String home) {
        System.out.println("----------我是依赖注入方法------------------ : " + home);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("----------我是afterPropertiesSet方法执行----------");
    }

    // PostConstruct 注解用于需要在依赖注入完成后执行任何初始化的方法
    @PostConstruct
    public void postConstruct() {
        System.out.println("----------我是postConstruct方法执行----------");
    }

    public void init() {
        System.out.println("----------我是init方法执行----------");
    }

    @Bean(initMethod = "init")
    public MyInitializingBean test() {
        return new MyInitializingBean();
    }

}
